#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2024/8/23 21:55
# @Author  : Yuyun
# @File    : leetcode_209_长度最小的子数组.py
# @IDE     : PyCharm

"""
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ，并返回其长度。如果不存在符合条件的子数组，返回 0 。

示例 1：
输入：target = 7, nums = [2,3,1,2,4,3]
输出：2
解释：子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2：
输入：target = 4, nums = [1,4,4]
输出：1

示例 3：
输入：target = 11, nums = [1,1,1,1,1,1,1,1]
输出：0

提示：
1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5

进阶：
如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

"""

class Solution:
    #降序排序求和
    #排序时间复杂度O(nlogn)，求和判断时间复杂度O(n)
    def mini_subarray(self, target, nums):
        length = len(nums)
        # nums.sort(reverse=True)
        start = 0
        sum = 0
        while start < length:
            sum += nums[start]
            if sum >= target:
                return start + 1
            start += 1
        return 0

    #滑动窗口 O(n)
    """
    就是不断的调节子序列的起始位置和终止位置，从而得出我们要想的结果
    滑动窗口的精妙之处在于根据当前子序列和大小的情况，不断调节子序列的起始位置
    """
    def mini_subarray_I(self, target, nums):
        length = len(nums)
        start = 0   #窗口初始位置
        res_length = float('inf')   #设置结果初始值为无穷大
        sum = 0     #窗口和
        for end in range(length):   #窗口结束位置
            sum += nums[end]
            while sum >= target:
                sub_length = end - start + 1    #窗口大小
                if sub_length < res_length:     #取符合条件的最小窗口值
                    res_length = sub_length
                #窗口向后移动，不断变更i（子序列的起始位置）
                sum -= nums[start]
                start += 1
        return res_length

if __name__=="__main__":

    target = int(input())
    nums = list(map(int, input().split(',')))
    #必须先将类实例化，再调用函数
    #否则，会报错missing 1 required positional argument
    solution = Solution()
    result = solution.mini_subarray_I(target, nums)
    print(result)